用generator写杨辉三角

def triangles():
    L = [1]
    while True:
        yield L
        L = [sum(i) for i in zip([0]+L, L+[0])]

首先储存杨辉三角第一行:1

然后用生成器计算出之后的所有行:

zip()函数求出两个参数对应项匹配起来,例如:

x = [x1, x2]
y = [y1, y2]
zip(x,y) = [(x1, y1), (x2,y2)]
zip()函数详情 点击这里


函数第一次运行到

L = [sum(i) for i in zip([0]+L, L+[0])]

时,L为[1], zip( [0]+L, L+[0] )等价于zip( [0]+[1], [1]+[0]),  即zip( [0, 1], [1, 0] ),匹配为[ (0, 1), (1, 0)]

通过列表生成式List Comprehensions)得到L = [1, 1],这样杨辉三角第二行便计算完成了

依次循环得到更多行的杨辉三角。


def triangles():
    L = [1]
    while True:
        yield L
        L = [1] + [x+y for x,y in zip(L[:-1],L[1:])] + [1]

这段代码不同处在于

L = [1] + [x+y for x,y in zip(L[:-1],L[1:])] + [1]

更容易理解,zip()传入的参数是两个切片得到的list

L[: -1],原应写作L[0: -1],意为从第一个元素开始索引到最后一个元素为止(不包括最后一个元素)

L[1:],意为从第二个元素开始(第一个元素下标记为0),索引完整个列表(包括最后一个元素)

我们取杨辉三角第五行为例:1 4 6 4 1

L[: -1]得到[1, 4, 6, 4]    L[1:]得到[4, 6, 4, 1]

那么下面一段代码

[x+y for x,y in zip(L[:-1],L[1:])]

就会得到[5, 10, 10, 5],再依照代码前后各加上[1],就变成了[1, 5, 10, 10, 5, 1]即杨辉三角第六行


感谢博主 张沐阳的博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值